/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | foam-extend: Open Source CFD
   \\    /   O peration     | Version:     4.1
    \\  /    A nd           | Web:         http://www.foam-extend.org
     \\/     M anipulation  | For copyright notice see file Copyright
-------------------------------------------------------------------------------
License
	This file is part of foam-extend.

	foam-extend is free software: you can redistribute it and/or modify it
	under the terms of the GNU General Public License as published by the
	Free Software Foundation, either version 3 of the License, or (at your
	option) any later version.

	foam-extend is distributed in the hope that it will be useful, but
	WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.

\*---------------------------------------------------------------------------*/

#include "IOdictionary.H"
#include "objectRegistry.H"
#include "Pstream.H"

// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

namespace Foam
{
defineTypeNameAndDebug(IOdictionary, 0);

bool IOdictionary::writeDictionaries
(
	debug::infoSwitch("writeDictionaries", 0)
);
}


// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

Foam::IOdictionary::IOdictionary(const IOobject& io)
:
	regIOobject(io)
{
	// Temporary warning
	if (debug && io.readOpt() == IOobject::MUST_READ)
	{
		WarningIn("IOdictionary::IOdictionary(const IOobject&)")
			<< "Dictionary " << name()
			<< " constructed with IOobject::MUST_READ"
			" instead of IOobject::MUST_READ_IF_MODIFIED." << nl
			<< "Use MUST_READ_IF_MODIFIED if you need automatic rereading."
			<< endl;
	}

	// Everyone check or just master
	bool masterOnly =
		regIOobject::fileModificationChecking == timeStampMaster
	 || regIOobject::fileModificationChecking == inotifyMaster;


	// Check if header is ok for READ_IF_PRESENT and READ_IF_PRESENT_IF_MODIFIED
	bool isHeaderOk = false;
	if
	(
		io.readOpt() == IOobject::READ_IF_PRESENT
	 || io.readOpt() == IOobject::READ_IF_PRESENT_IF_MODIFIED
	)
	{
		if (masterOnly)
		{
			if (Pstream::master())
			{
				isHeaderOk = headerOk();
			}
			Pstream::scatter(isHeaderOk);
		}
		else
		{
			isHeaderOk = headerOk();
		}
	}


	if
	(
		(
			io.readOpt() == IOobject::MUST_READ
		 || io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
		)
	 || isHeaderOk
	)
	{
		readFile(masterOnly);
	}

	dictionary::name() = IOobject::objectPath();
}


Foam::IOdictionary::IOdictionary(const IOobject& io, const dictionary& dict)
:
	regIOobject(io)
{
	// Temporary warning
	if (debug && io.readOpt() == IOobject::MUST_READ)
	{
		WarningIn
		(
			"IOdictionary::IOdictionary(const IOobject& const dictionary&)"
		)   << "Dictionary " << name()
			<< " constructed with IOobject::MUST_READ"
			" instead of IOobject::MUST_READ_IF_MODIFIED." << nl
			<< "Use MUST_READ_IF_MODIFIED if you need automatic rereading."
			<< endl;
	}

	// Everyone check or just master
	bool masterOnly =
		regIOobject::fileModificationChecking == timeStampMaster
	 || regIOobject::fileModificationChecking == inotifyMaster;


	// Check if header is ok for READ_IF_PRESENT and READ_IF_PRESENT_IF_MODIFIED
	bool isHeaderOk = false;
	if
	(
		io.readOpt() == IOobject::READ_IF_PRESENT
	 || io.readOpt() == IOobject::READ_IF_PRESENT_IF_MODIFIED
	)
	{
		if (masterOnly)
		{
			if (Pstream::master())
			{
				isHeaderOk = headerOk();
			}
			Pstream::scatter(isHeaderOk);
		}
		else
		{
			isHeaderOk = headerOk();
		}
	}


	if
	(
		(
			io.readOpt() == IOobject::MUST_READ
		 || io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
		)
	 || isHeaderOk
	)
	{
		readFile(masterOnly);
	}
	else
	{
		dictionary::operator=(dict);
	}

	dictionary::name() = IOobject::objectPath();
}


Foam::IOdictionary::IOdictionary(const IOobject& io, Istream& is)
:
	regIOobject(io)
{
	dictionary::name() = IOobject::objectPath();
	// Note that we do construct the dictionary null and read in afterwards
	// so that if there is some fancy massaging due to a functionEntry in
	// the dictionary at least the type information is already complete.
	is  >> *this;
}


// * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * * //

Foam::IOdictionary::~IOdictionary()
{}


// * * * * * * * * * * * * * * * Members Functions * * * * * * * * * * * * * //

const Foam::word& Foam::IOdictionary::name() const
{
	return regIOobject::name();
}


// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //

void Foam::IOdictionary::operator=(const IOdictionary& rhs)
{
	dictionary::operator=(rhs);
}


// ************************************************************************* //
